import RenderContext from "@/views/cg/lib/RenderContext.ts";

function powerOf2(value){
  return (value && (value - 1)) == 0
}
function powerOf2Temp(n) {
  if(0 === (n&(n-1))&& n > 1) {
    return true;
  }
  return false;
}

// 全局的
let id_counte = 0
export class ImageTexture{
  constructor(src) {
    const gl = RenderContext.getGL()
    // 创建纹理
    const texture = gl.createTexture();
    this.src = src
    this.texture = texture
    this.id = id_counte++
    gl.activeTexture(gl.TEXTURE0 + this.id)
    this.gl = gl
    gl.bindTexture(gl.TEXTURE_2D, texture)

    // 避免网络请求 返回数据之前出错，先做一个1*1的纹理 放在这里
    gl.texImage2D(
      gl.TEXTURE_2D, // bind point (target)
      0,
      gl.RGBA, // 格式 internal format gpu内部格式
      1, // width
      1, // height
      0, // border
      gl.RGBA, // 格式 format 程序的格式
      gl.UNSIGNED_BYTE,
      new Uint8Array([0,255, 0,255])
    )

    const image  = new Image()
    image.src = src
    image.addEventListener('load', () => {
      gl.activeTexture(gl.TEXTURE0 + this.id)
      gl.bindTexture(gl.TEXTURE_2D, texture)
      gl.texImage2D(
        gl.TEXTURE_2D, // bind point
        0, // level of detail mipmap的等级 写1 就是 128*128 最多
        gl.RGBA, // 格式 internal format gpu内部格式
        gl.RGBA, // format
        gl.UNSIGNED_BYTE, // type
        image
      )

      // 产生mipmap的行为 控制产生mipmap，如果宽和高是2的指数倍 就可以产生mipmap
      if(powerOf2(image.width)  && powerOf2(image.height)){
        gl.generateMipmap(gl.TEXTURE_2D)
      }else{
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
      }
    })

    // STPQ 方向
    // gl.texParameteri(
    //   gl.TEXTURE_2D,
    //   gl.TEXTURE_WRAP_S, // S方向
    //   gl.CLAMP_TO_EDGE //停留在最后的像素
    // )
    // STPQ 方向
    // gl.texParameteri(
    //   gl.TEXTURE_2D,
    //   gl.TEXTURE_WRAP_T, // S方向
    //   gl.CLAMP_TO_EDGE //停留在最后的像素
    // )

    // 变清晰 不渐变
    // gl.texParameteri(
    //   gl.TEXTURE_2D,
    //   gl.TEXTURE_MAG_FILTER, // 纹理少 像素多，算法
    //   gl.NEAREST)


    const program = RenderContext.getProgram()
    this.textureLocation = gl.getUniformLocation(program, 'u_texture')
    // gl.uniform1i(textureLocation, 0)
  }

  associate(){
    this.gl.uniform1i(this.textureLocation, this.id)
  }
}
